//rollup配置
import { createRequire } from 'module'
import { fileURLToPath } from 'url'
import path from 'path'  //rollup支持es6模块导入写法
import json from '@rollup/plugin-json'//json
import resolvePlugin from '@rollup/plugin-node-resolve'//node
import ts from "rollup-plugin-typescript2"//ts

const require = createRequire(import.meta.url)
const __dirname = fileURLToPath(new URL('.', import.meta.url))

console.info(`rollup进程打包的目标是---------->`, process.env.TARGET)

//根据进程执行环境变量中的TARGET信息获取目录下的package.json

const packagesDir = path.resolve(__dirname, 'packages')//在当前项目目录下查找packages目录并解析
console.info(`项目总包目录是----------->`, packagesDir)

const packageDir = path.resolve(packagesDir, process.env.TARGET)//从packages下找到需要打包的包名
console.info(`打包的目录是----------->${packageDir}`)

//永远相对与packageDir这个目录获取需要的信息，上面一直使用path.resolve(" "," ")这种写法是因为第一个参数对应的变量不固定，而下面所有执行的packageDir是固定的变量
const resolve = (p) => path.resolve(packageDir, p)

const pkg = require(resolve('package.json'))//json文件可以用require方法直接导入
const name = path.basename(packageDir)//取当前路径的最后一个名称，也就是包的名称
console.info(`打包的目录下的package.json配置文件是----------->`, pkg, name)

//对打包类型先做一个映射表，根据提供的formats进行格式化
const outputConfig = {//自定义的输出配置项，但是对于不同的模块package.json里的配置是不一样的，所以下面还需要过滤处理
    "esm-bundler": { file: resolve(`dist/${name}.esm-bundler.js`), "format": "es" },//es6模块
    "cjs": { file: resolve(`dist/${name}.cjs.js`), "format": "cjs" },//node使用
    "global": { file: resolve(`dist/${name}.global.js`), "format": "iife" }//全局的，iife表示立即执行的函数
}

const options = pkg.buildOptions;//自己在package.json中自定义的选项

function createConfig(format, output) {
    output.name = options.name//给上面的output的每个对象添加name属性
    output.sourcemap = true//方便调试，可以定位bug

    //生成rollup配置
    return {
        input: resolve('src/index.ts'),//打包入口
        output,//打包出口配置
        plugins: [//第三方插件,必须按照下面的顺序写
            json(),
            ts({
                tsconfig: path.resolve(__dirname, 'tsconfig.json')
            }),
            resolvePlugin()
        ]
    }
}

//rollup最终导出的配置
export default options.formats.map((format) => createConfig(format, outputConfig[format]))//将每种格式按照配置映射表的方式进行打包
